//package pushtest.mobike.com.mtpush.scanner;
//
//
//import android.animation.ValueAnimator;
//import android.content.Context;
//import android.graphics.Bitmap;
//import android.graphics.Bitmap.Config;
//import android.graphics.Canvas;
//import android.graphics.Color;
//import android.graphics.Paint;
//import android.graphics.Paint.Style;
//import android.graphics.Point;
//import android.graphics.PorterDuff.Mode;
//import android.graphics.PorterDuffXfermode;
//import android.graphics.Rect;
//import android.graphics.RectF;
//import android.graphics.Typeface;
//import android.graphics.drawable.ShapeDrawable;
//import android.graphics.drawable.shapes.RoundRectShape;
//import android.os.Build.VERSION;
//import android.os.Build.VERSION_CODES;
//import android.support.annotation.Nullable;
//import android.support.v4.content.ContextCompat;
//import android.util.AttributeSet;
//import android.view.Gravity;
//import android.view.View;
//import android.widget.TextView;
//import java.util.Arrays;
//import pushtest.mobike.com.mtpush.R;
//
///**
// * Created by Xiz on May 24, 2017.
// */
//
//public class ViewFinderView extends View {
//
//  private Viewstatic final boolean USE_ANIMATOR = true;
//
//  public static final int MOVE_INTERVAL = 15;
//  public static final float DIMENSION_RATIO = 5f / 8;
//  private static final PorterDuffXfermode CLEAR = new PorterDuffXfermode(Mode.CLEAR);
//  public int strokeWidth;
//  public static final int PADDING = 50;
//  private int laserHeight;
//
//  private int laserOffset = 0;
//  private Rect framingRect = null;
//  private Paint borderPaint;
//  private Paint clearerPaint;
//  private Paint maskPaint;
//  private Paint whitePaint;
//  private Bitmap textCacheBitmap;
//  private RectF framingRectF;
//  private float radii;
//  private RectF framingRectFInset;
//  private Paint laserPaint;
//  private int maskColor;
//
//  public Rect getFramingRect() {
//    return framingRect;
//  }
//
//  public ViewFinderView(Context context) {
//    super(context);
//    init();
//  }
//
//  public ViewFinderView(Context context, @Nullable AttributeSet attrs) {
//    super(context, attrs);
//    init();
//  }
//
//  private void init() {
//
//    strokeWidth = getDp(2);
//    radii = getDp(8);
//
//    laserHeight = getDp(3);
//    laserPaint = new Paint();
//    laserPaint.setColor(Color.parseColor("#ff4611"));
//
//    borderPaint = new Paint();
//    borderPaint.setColor(Color.parseColor("#77ffffff"));
//    borderPaint.setStyle(Style.STROKE);
//    borderPaint.setStrokeWidth(strokeWidth);
//
//    maskPaint = new Paint();
//    maskPaint.setXfermode(CLEAR);
//    maskColor = ContextCompat.getColor(getContext(), R.color.viewfinder_mask);
//
//    whitePaint = new Paint();
//    whitePaint.setColor(Color.BLACK);
//
//    clearerPaint = new Paint();
//    clearerPaint.setXfermode(CLEAR);
//
//    float[] outerRadii = new float[8];
//    Arrays.fill(outerRadii, getDp(32));
//    RoundRectShape bgShape = new RoundRectShape(outerRadii, null, null);
//
//    TextView tv = new TextView(getContext());
//    tv.setTextSize(12);
//    tv.setTextColor(Color.WHITE);
//    if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN_MR1) {
//      tv.setTextAlignment(TEXT_ALIGNMENT_CENTER);
//    } else {
//      tv.setGravity(Gravity.CENTER_HORIZONTAL);
//    }
//    tv.setTypeface(Typeface.create("System", Typeface.BOLD));
//    tv.setText(R.string.mobike_scan_qrcode_hint);
//
//    ShapeDrawable bgDrawable = new ShapeDrawable(bgShape);
//    bgDrawable.getPaint().setColor(Color.parseColor("#77000000"));
//    tv.setBackground(bgDrawable);
//    tv.setPadding(getDp(12), getDp(8), getDp(12), getDp(8));
//
//    xferPaint.setXfermode(DST_OUT);
//
//    textCacheBitmap = UtilsKt.viewToBitmap(tv);
//  }
//
//  @Override
//  protected void onSizeChanged(int xNew, int yNew, int xOld, int yOld) {
//    updateFramingRect();
//  }
//
//  public synchronized void updateFramingRect() {
//    Point viewResolution = new Point(getWidth(), getHeight());
//    int width = (int) (getWidth() * DIMENSION_RATIO);
//    int height = width;
//
//    if (width > getWidth()) {
//      width = getWidth() - PADDING;
//    }
//
//    if (height > getHeight()) {
//      height = getHeight() - PADDING;
//    }
//
//    int leftOffset = (viewResolution.x - width) / 2;
//    int topOffset = (viewResolution.y - height) / 2;
//    framingRect = new Rect(leftOffset, topOffset, leftOffset + width, topOffset + height);
//    framingRectF = new RectF(leftOffset, topOffset, leftOffset + width, topOffset + height);
//    framingRectFInset = new RectF(framingRectF);
//    framingRectFInset.inset(strokeWidth / 2, strokeWidth / 2);
//
//    // invalidate bitmap caches
//    xferBitmapCache = null;
//  }
//
//
//  @Override
//  protected void onDraw(Canvas canvas) {
//    super.onDraw(canvas);
//
//    if (framingRect != null) {
//
//      if (!USE_ANIMATOR) {
//        calculate();
//      }
//
//      drawMask(canvas);
//      drawLaser(canvas);
//      drawBorder(canvas);
//      drawText(canvas);
//
//      if (!USE_ANIMATOR) {
//        // draw next frame vsync-ly
//        postInvalidateOnAnimation(framingRect.left, framingRect.top,
//            framingRect.right, framingRect.bottom);
//      }
//    }
//  }
//
//  private void drawMask(Canvas canvas) {
//    canvas.drawColor(maskColor);
//    canvas.drawRoundRect(framingRectF, radii, radii, maskPaint);
//  }
//
//  private static final PorterDuffXfermode DST_OUT = new PorterDuffXfermode(Mode.DST_OUT);
//  private Paint xferPaint = new Paint();
//  private Bitmap xferBitmapCache = null;
//
//  ValueAnimator animator = null;
//  private int preTop;
//
//  @Override
//  protected void onAttachedToWindow() {
//    super.onAttachedToWindow();
//    if (!USE_ANIMATOR) {
//      return;
//    }
//    ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f);
//    this.animator = animator;
//    animator.setInterpolator(new EasingInterpolator(Ease.QUART_IN_OUT));
//    animator.setRepeatCount(ValueAnimator.INFINITE);
//    animator.setRepeatMode(ValueAnimator.RESTART);
//    animator.setDuration(3000L);
//    animator.addUpdateListener(animation -> {
//      float fraction = (float) animation.getAnimatedValue();
//      if (framingRect == null) {
//        return;
//      }
//
//      laserOffset = (int) ((framingRectF.height() + laserHeight) * fraction) - laserHeight;
//      laserRect.left = framingRect.left;
//      laserRect.top = framingRect.top + laserOffset;
//      laserRect.right = framingRect.right;
//      laserRect.bottom = framingRect.top + laserOffset + laserHeight;
//
//      if (laserRect.top != preTop) {
//        preTop = laserRect.top;
//        postInvalidate(framingRect.left, framingRect.top,
//            framingRect.right, framingRect.bottom);
//      }
//
//    });
//    animator.start();
//  }
//
//  @Override
//  protected void onDetachedFromWindow() {
//    Timber.d("onDetachedFromWindow");
//    super.onDetachedFromWindow();
//    if (animator != null) {
//      animator.end();
//      animator = null;
//    }
//  }
//
//  final Rect laserRect = new Rect();
//
//  /**
//   * draw laser over laserRect
//   */
//  private void drawLaser(Canvas canvas) {
//    int sc = canvas.saveLayer(framingRectF, null, Canvas.ALL_SAVE_FLAG);
//    {
//      // laser
//      canvas.drawRect(laserRect, laserPaint);
////      canvas.drawBitmap(laserBitmap, null, rect, null);
//
//      // if laser is in rect area, we dont have to apply xfer calculation
//      if (laserOffset < radii || laserOffset > framingRectF.height() - radii - laserHeight) {
//
//        // mask (we use a two pass dst_out to realize a dst_in effect...)
//        if (xferBitmapCache == null) {
//          xferBitmapCache = Bitmap
//              .createBitmap(framingRect.width(), framingRect.height(), Config.ARGB_8888);
//          Canvas c = new Canvas(xferBitmapCache);
//          int sc2 = c.save();
//          c.translate(-framingRectF.left, -framingRectF.top);
//          c.drawRect(framingRectF, whitePaint);
//          c.drawRoundRect(framingRectF, radii, radii, xferPaint);
//          c.restoreToCount(sc2);
//        }
//
//        canvas.drawBitmap(xferBitmapCache, null, framingRectF, xferPaint);
//
//      }
//    }
//    canvas.restoreToCount(sc);
//  }
//
//  /**
//   * calculate location of laserOffset and it's rect
//   */
//  private void calculate() {
//
//    final int height = laserHeight;
//    final int range = framingRect.bottom - framingRect.top;
//    final int increment = (int) (Math.sin(Math.PI * laserOffset / range) * MOVE_INTERVAL);
//    laserOffset = (laserOffset + (increment > 1 ? increment : 1)) % (range - height + 1);
//    laserRect.left = framingRect.left;
//    laserRect.top = framingRect.top + laserOffset;
//    laserRect.right = framingRect.right;
//    laserRect.bottom = framingRect.top + laserOffset + height;
//  }
//
//  private void drawBorder(Canvas canvas) {
//    canvas.drawRoundRect(framingRectFInset, radii, radii, borderPaint);
//  }
//
//
//  private void drawText(Canvas canvas) {
//    float margin = getDp(38);
//    float x = canvas.getWidth() / 2;
//    float y = framingRect.top - margin;
//
//    float w = textCacheBitmap.getWidth();
//    float h = textCacheBitmap.getHeight();
//    canvas.drawBitmap(textCacheBitmap, x - w / 2, y - h / 2, null);
//  }
//}